package com.itheima.tlias.controller;

import com.itheima.tlias.dto.SelectDeptDTO;
import com.itheima.tlias.entity.Dept;
import com.itheima.tlias.po.InsertDeptParam;
import com.itheima.tlias.service.DeptService;
import com.itheima.tlias.util.ResultUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/depts")
/**
 * @RequestMapper Target -> 类上 , 方法上
 *                  类上  -> 提取一个controller中的重复路径
 *                  方法上 -> 定义该接口的请求方法
 */
public class DeptController {

//    @Autowired
//    DeptService deptService;
    @Resource
    DeptService deptService;

    @GetMapping
    public ResultUtil selectAll(){
//        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
//        List<SelectDeptDTO> list = depts.stream().map(dept -> {
//            SelectDeptDTO dto = new SelectDeptDTO();
//            dto.setId(dept.getId());
//            dto.setName(dept.getName());
//            String format = dept.getUpdateTime().format(pattern);
//            dto.setUpdateTime(format);
//            return dto;
//        }).toList();
//
//        List<SelectDeptDTO> depts = deptMapper.selectEmpByPage();
        List<SelectDeptDTO> dto = deptService.selectAll();
        return ResultUtil.success(dto);
    }

    /**
     * @PathVariable 注解的作用 :
     *              获取URL以/分割的路径变量
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public ResultUtil selectById(@PathVariable Integer id){
        SelectDeptDTO dto = deptService.selectById(id);
        return ResultUtil.success(dto);
    }

    /**
     * get/delete请求 参数一般拼接到url后面
     * post/put请求 参数一般放在请求体里面,且以JSON格式进行传输
     * @RequestBody 作用 : 1.是从http请求中读传输的数据
     *                    2.把JSON字符串自动转成对象  被对应的GetMapper 和 PostMapper等替代了
     */
    @PostMapping
    public ResultUtil insertDept(@RequestBody InsertDeptParam param){
//        Log.info("请求到的数据{}",param);
        try {
            int flag = deptService.insertDept(param);
            return flag == 0 ? ResultUtil.fail("新增失败") : ResultUtil.success("新增成功");
        }catch (DuplicateKeyException e){
            return ResultUtil.fail("该部门已存在");
        }
//        try {
//            BufferedReader reader = request.getReader();
//            Log.info("读取请求中的数据{}",reader.readLine());
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }

//        Dept dept = new Dept();
//        dept.setName("");
//        dept.setUpdateTime(LocalDateTime.now());
//        return deptMapper.insertDept(dept);
    }

    /**
     * @RequestParam 注解的作用 :
     *              1. 根据指定的K,获取Http URL中的值
     *              2. 可以指定是否必传参数 required , 如果指定必传 , 前端没传相应参数 -> 400
     *              3. 给参数指定默认值 defaultValue 默认值属性
     * @param id
     * @return
     */
    @DeleteMapping
    public ResultUtil deleteById(@RequestParam("id") Integer id){
        int flag = deptService.deleteById(id);
        return flag ==0?ResultUtil.fail("删除失败"):ResultUtil.success("删除成功");
    }

    @PutMapping
    public ResultUtil updateById(@RequestBody Dept dept){
            return deptService.updateById(dept);
    }

    @DeleteMapping("batchDelete")
    public ResultUtil batchDelete(@RequestParam("ids")List<Integer> id){
        int i = deptService.batchDelete(id);
        return ResultUtil.success(i);
    }
}
